/**
 *
 * LICENSE: Some license information
 *
 * @author Konstantin Chumachneko
 */
 
/**
 * @var custvox.userlist - Определение пространства имен проекта.
 * Глобальный объект.
 */
var phonebook = {	
		model: {},
		view: {},
		controller: {}	
};
/**
 * Класс таблицы телефонной книги.
 * @lends phonebook.view.PhonebookView
 */
phonebook.view.PhonebookView = Base.extend({
	
    controller : null,		// объект управления процессами Приложения
    grid: null,
	
    /**
     * Конструктор класса
     * @author Konstantin Chumachenko
     * 
     * @augments Base
     * @class Класс панели списка пользователей.
     * 
     * <p><b>Пример:</b></p>
     * <pre class="code">
     * var phonebookView = new phonebook.view.PhonebookView(controller);
     * </pre>
     * 
     * @constructs
     * @param {Controller} controller Контроллер приложения.
     */
    constructor : function(controller) {	
        console.log("-- PhonebookView: Конструктор.");
        this.controller = controller;
        this.domElement = $(MAIN_TABLE_HOLDER);
        this.render(this.domElement);
    },
	
    /**
     * Возвращает DOM-элемент этой панели 
     * @function
     * @public 
     * @memberOf phonebook.view.PhonebookView#
     */
    getDomElement : function() {
        return this.domElement;
    },
	
    /**
     * Выполняется отрисовка панели.
     * @private 
     * @function
     * @param (elementDOM) renderTo Элемент DOM, внутри которого будет создан контейнер.
     * @return none
     */
    render : function(renderTo) {
        console.log("-- PhonebookView: render.");
        var me = this;
        var model = me.controller.getModel();
        $(renderTo).html("");
        /**
         * Таблица
         */
        me.grid = $(renderTo).dataTable( {
            "bProcessing": true,           
            "bFilter": false,
            "aaData": model,
            "aoColumns": [
            {
                "sTitle": "Абонент"
            },
            {
                "sTitle": "П.І.Б."
            },
            {
                "sTitle": "Телефон"
            },
            {
                "sTitle": "№ Ауд.",
                "sWidth":50
            },
            {
                "sTitle": "Підрозділ"
            }
            ],
            "oLanguage": {
                "sLengthMenu": "Показати по _MENU_ на сторінці",
                "sZeroRecords": "Нічого не знайдено",
                "sInfo": "Показано від _START_ до _END_ з _TOTAL_",
                "sInfoEmpty": "Пусто",
                "sInfoFiltered": "(filtered from _MAX_ total records)",
                "oPaginate": {
                    "sPrevious":"Попередня",
                    "sNext":"Наступна"
                }
            }
        } );
    }
});/**
 * Класс таблицы списка.
 * @lends phonebook.view.SidebarView
 */
phonebook.view.SidebarView = Base.extend({
	
    controller : null,		// объект управления процессами Приложения   
	
    /**
     * Конструктор класса
     * @author Konstantin Chumachenko
     * 
     * @augments Base
     * @class Класс панели списка пользователей.
     * 
     * <p><b>Пример:</b></p>
     * <pre class="code">
     * var SidebarView = new phonebook.view.SidebarView(controller);
     * </pre>
     * 
     * @constructs
     * @param {Controller} controller Контроллер приложения.
     */
    constructor : function(controller) {	
        console.log("-- SidebarView: Конструктор.");
        this.controller = controller;
        this.domElement = $(SIDEBAR_HOLDER);
        this.render(this.domElement);
    },
	
    /**
     * Возвращает DOM-элемент этой панели 
     * @function
     * @public 
     * @memberOf phonebook.view.SidebarView#
     */
    getDomElement : function() {
        return this.domElement;
    },
	
    /**
     * Выполняется отрисовка панели.
     * @private 
     * @function
     * @param (elementDOM) renderTo Элемент DOM, внутри которого будет создан контейнер.
     * @return none
     */
    render : function(renderTo) {
        console.log("-- SidebarView: render!.");
        var me = this;
        var realData = null;
        $.ajax({
            type: 'POST',
            url: 'index?ajax=getUnitList',
            async: false,
            success: function(data,  textStatus,  jqXHR){     
                var com =  jQuery.parseJSON(data);                
                realData = com["unitList"];
            }
        });
        var length = realData.length,
        unit = null,
        renderDiv = null,
        content = null;
        
        for (var i = 0; i < length; i++) {
            unit = realData[i];
            content = unit["content"];
            renderDiv = "unit"+i;
            $(SIDEBAR_HOLDER).append("<h3>"+unit["name"]+"</h3><div id='"+renderDiv+"'></div>");
            for (var j = 0; j< content.length; j++){
                new widget.ActiveLink({
                    text : content[j],
                    renderTo: '#'+renderDiv,
                    listeners : {
                        click : function(lnk, elementDom){
                            me.controller.doFilter(lnk.text);
                        }
                    }
                });
            }
        }
       
        $(SIDEBAR_HOLDER).accordion({
            heightStyle: "content",
            collapsible: true           
        });
    }
	
});/**
 * Класс таблицы списка.
 * @lends phonebook.view.SearchView
 */
phonebook.view.SearchView = Base.extend({
	
    controller : null,		// объект управления процессами Приложения
    typeBox: null,
    searchText: null,
    /**
     * Конструктор класса
     * @author Konstantin Chumachenko
     * 
     * @augments Base
     * @class Класс панели списка пользователей.
     * 
     * <p><b>Пример:</b></p>
     * <pre class="code">
     * var SearchView = new phonebook.view.SearchView(controller);
     * </pre>
     * 
     * @constructs
     * @param {Controller} controller Контроллер приложения.
     */
    constructor : function(controller) {	
        console.log("-- SearchView: Конструктор.");
        this.controller = controller;
        this.domElement = $(SEARCH_HOLDER);
        this.render(this.domElement);
    },
	
    /**
     * Возвращает DOM-элемент этой панели 
     * @function
     * @public 
     * @memberOf phonebook.view.SearchView#
     */
    getDomElement : function() {
        return this.domElement;
    },
	
    /**
     * Выполняется отрисовка панели.
     * @private 
     * @function
     * @param (elementDOM) renderTo Элемент DOM, внутри которого будет создан контейнер.
     * @return none
     */
    render : function(renderTo) {
        console.log("-- SearchView: render.");
        var me = this;
        $(renderTo).append("Пошук");
        /**
         * Выпадающий список, содержищас типы поиска
         */
        this.typeBox = new widget.ComboboxStd({
            cls: "searchElement",
            name: 'search_type',
            input: {
                cls : 'select',
                width: 150
            },
            items: [
            {
                value:'0', 
                text:'За призвищем'
            },

            {
                value:'1', 
                text:'За телефоном'
            },

            {
                value:'2', 
                text:'За аудиторію'
            }
            ],      
            renderTo: renderTo,
            listeners: {
                change: function(field,  record,  elementDom){
                    me.controller.onChangeGuestbook(field.value);
                }
            }
        });
        
        /**
         * Текст поиска
         */
        this.searchText = new widget.Text({
            id: 'inp2',
            cls: 'searchElement',
            name: 'search_text',
            input: {
                cls: 'inp',
                align: 'left',
                width: 210
            },
            renderTo: renderTo
        });
        
        /**
         * Кнопка поиска
         */
        this.formSubmitButton= new widget.Button({
            cls: 'searchElement',
            text:  "Шукати",
            renderTo: renderTo,
            listeners: {
                click: function(btn,  elementDom){               
                    me.controller.doSearch();
                }
            }
        });
    }
    
    
	
});/**
 * Это класс модели пользователя.
 * @lends phonebook.model.PhoneListModel
 */
phonebook.model.PhoneListModel = Base.extend({

    controller : null,		// объект управления процессами Приложения
    phoneList: null,
    
    /**
     * Конструктор класса
     * @author Konstantin Chumachenko
     * @class Класс модели списка книг.
     * 
     * <p><b>Пример:</b></p>
     * <pre class="code">
     * var PhoneListModel = new phonebook.model.PhoneListModel(controller);
     * PhoneListModel.load();
     * </pre>
     * 
     * @constructs
     * @param {Controller} controller Контроллер приложения.
     */
    constructor : function(controller) {
        console.log('-- PhoneListModel: Конструктор.');
        this.controller = controller;
    },
	
    /**
     * Загрузить данные модели таблицы.
     * @public 
     * @function 
     * @memberOf phonebook.model.PhoneListModel#
     */
    load: function() {
        var me = this;
        try {		
            $.ajax({
                type: 'POST',
                url: "index?ajax=getPhoneList",
                async: false,
                success: function(data,  textStatus,  jqXHR){
                    var com =  jQuery.parseJSON(data);                   
                    me.phoneList = com.aaData;
                }
            });
        }
        catch (e) {
            throw 'phonebook.model.PhoneListModel::load(): '+e;
        }
    },
    filterLoad: function(filter){
        var me = this;
        console.log("Filtred load");
        try {		
            $.ajax({
                type: 'POST',
                url: "index?ajax=getPhoneList&filter="+filter,
                async: false,
                success: function(data,  textStatus,  jqXHR){
                    var com =  jQuery.parseJSON(data);                   
                    me.phoneList = com.aaData;
                }
            });
        }
        catch (e) {
            throw 'phonebook.model.PhoneListModel::load(): '+e;
        }
    },
    searchLoad: function(data){
        var me = this;
        console.log("Search load: "+data);
        try {		
            $.ajax({
                type: 'POST',
                url: "index?ajax=getPhoneList&"+data,
                async: false,
                success: function(data,  textStatus,  jqXHR){
                    var com =  jQuery.parseJSON(data);                   
                    me.phoneList = com.aaData;
                }
            });
        }
        catch (e) {
            throw 'phonebook.model.PhoneListModel::load(): '+e;
        }
    },
    getModel: function(){
        return this.phoneList;
    }
});
/**
 * Это класс управления процессами Приложения.
 * @lends phonebook.controller.Controller
 */
phonebook.controller.Controller = Base.extend({

    phoneListModel: null,
    phonebookView: null,
    sidebarView: null,
    searchView: null,
   
    /**
     * Конструктор класса
     * @author Konstantin Chumachenko
     * @augments Base
     * @class Класс управления процессами Приложения.
     * 
     * @constructs
     */
    constructor : function() {
        console.log("-- Controller: Конструктор.");
        var me = this;
        this.phoneListModel = new phonebook.model.PhoneListModel(me);
        this.phoneListModel.load();
        this.phonebookView = new phonebook.view.PhonebookView(me);
        this.sidebarView = new phonebook.view.SidebarView(me);
        this.searchView = new phonebook.view.SearchView(me);
        
    },
    getModel: function(){
        return this.phoneListModel.getModel();  
    },
    /**
     * Формирует и отправляет поисковой запрос
     */
    doSearch: function(){      
        this.phoneListModel.searchLoad($(SEARCH_HOLDER).serialize());  
        this.refreshTable();
    },
    
    /**
     * Выполняет фильтрацию результов по переходу меню
     */
    doFilter: function(unitName){
        this.phoneListModel.filterLoad(unitName);
        this.refreshTable();
    },
    /**
     * Выполняет обновление страницы
     */
    refreshTable: function(){
        this.phonebookView.grid.fnClearTable();
        this.phonebookView.grid.fnAddData(this.getModel());
    }
    
});
/**
 * Старт.
 * Запуск приложения после загрузки странички
 */
$(document).ready(function () {
	
	/* Вспомогательная функция форматирования строк сообщений.
	 * Пример:
	 *   alert("Hello {name}".format({ name: 'World' }));
	 */
	String.prototype.format = function (args) {
    	var newStr = this;
    	for (var key in args) {
        	newStr = newStr.replace('{' + key + '}', args[key]);
    	}
    	return newStr;
	}

	/*
	 * Теперь стартуем ...
	 */
	try {
		var controller = new phonebook.controller.Controller();
	}
	catch (e) {
		alert("Exception:\n\n" + e);
	}
});

